﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MLopez.BizVal.CW.Base;

namespace MLopez.BizVal.CW.DosTuplas
{
    public class DosTuplasUtils
    {        

        /// <summary>
        /// Implementa la funcion Theta en la representación con 2-tuplas.
        /// Esta función convierte una etiqueta del conjunto en una 2-tupla
        /// </summary>
        /// <param name="etiqueta">Etiqueta a convertir</param>
        /// <returns>2-tupla que representa a la etiqueta, si la etiqueta pertenece al conjunto. De lo contrario devuelve null</returns>
        public static DosTupla Theta(TriEtiqueta etiqueta)
        {
            DosTupla tupla = new DosTupla(etiqueta, 0);
            return tupla;
        }

        /// <summary>
        /// Implementa la función Delta en la representación con 2-tuplas.
        /// Dado un valor "beta" en el intervalo [0,g], donde g es el índice de la mayor etiqueta
        /// esta función devuelve la 2-tupla equivalente a dicho valor.
        /// </summary>
        /// <param name="beta">Valor numérico en el intervalo [0,g]</param>
        /// <returns>2-tupla equivalente. 
        /// Si el parámetro <paramref name="beta"/> no está en el intervalo [0,g] devuelve null</returns>
        public static DosTupla Delta(decimal beta)
        {
            int index = 0;
            DosTupla tupla = new DosTupla();
            index = Convert.ToInt32(Math.Round(beta, MidpointRounding.AwayFromZero));
            tupla.Indice = index;
            tupla.Alpha = beta - index;            
            return tupla;
        }

        /// <summary>
        /// Implementa la función inversa de Delta en la representación con 2-tuplas.
        /// Dada una 2-tupla, devuelve el valor numérico en el intervalo [0,g]
        /// equivalente a dicha 2-tupla
        /// </summary>
        /// <param name="tupla">2-tupla de la que queremos obtener el valor numérico</param>
        /// <returns>Valor numérico eqivalente, en el intervalo [0,g]</returns>
        /// <exception cref="CWException">Si la etiqueta de la 2-tupla no pertenece al conjunto</exception>
        public static decimal DeltaInversa(DosTupla tupla)
        {
            decimal retValue = 0;
            int index =  tupla.Indice;
            retValue = index + tupla.Alpha;            
            return retValue;
        }


    }
}
